package com.dk.util.String;

import com.dk.enumerate.DkRuleEnum;
import com.dk.util.log.Log;
import com.google.common.base.Strings;

import java.util.Arrays;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * 字符串工具类
 */
public class StringUtil {
    /**
     * 拼接请求协议+地址
     * @param protocol 请求协议
     * @param url 地址
     * @return 完整地址
     */
    public static String splicingProtocolAndUrl(String protocol,String url){
        //协议不为空时拼接地址.为空时默认拼接http协议
        if(!Strings.isNullOrEmpty(protocol)&&!Strings.isNullOrEmpty(url)){
            url = protocol+"://"+url;
        }else{
            url = "http" +"://"+url;
        }
        return url;
    }

    /**
     * 替换text中的Pattern为指定map中的数据
     * @param text 需要替换的文本
     * @param pattern 正则表达式
     * @param map 指定替换结果
     * @return 特换后的text
     */
    public static String replacePatternAsVar(String text, String pattern, Map<String,Object> map){
        if (text!=null) {
            //获取正则匹配模型
            Pattern patternObj = Pattern.compile(pattern);//  \\$\\{(.*?)}
            //获取匹配器对象
            Matcher matcher = patternObj.matcher(text);
            //遍历匹配器,获取需要匹配的值
            while (matcher.find()){
                //获取匹配值
                String key = matcher.group();
                String value= String.valueOf(map.get(key));
                //将text中的匹配值替换为map中以匹配值为key的value值
                text = text.replace(key, value);
                Log.info("---【参数替换】:"+key+"替换为:"+value);
                Log.info("---【参数替换】:替换后:"+text);
            }
        }
        return text;
    }

    /**
     * 替换text中的${xxx}为指定map中的数据
     * @param text 需要替换的文本
     * @param map 指定替换结果
     * @return 特换后的text
     */
    public static String replacePatternAsVar(String text, Map<String,Object> map){
        text = replacePatternAsVar(text, DkRuleEnum.REPLACE_PATTERN.getValue(),map);
        return text;
    }

    /**
     * 从消息头字符串获取指定key的value
     * @param headers 目标头部
     * @param key 目标key
     * @return
     */
    public static String getValueInHeaders(String headers,String key){
        String[] result = Arrays.stream(headers.split("\n")).filter(str->str.contains(key)).collect(Collectors.toList()).get(0).split(":");
        return result[0];
    }

}
